/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serv;

import IA.DistFS.Servers;
import aima.util.Pair;
import java.util.ArrayList;
import java.util.Set;

/**
 *
 * @author ferran
 */
public class OperacionsSimples {
	
	public static Estado swap( Estado state, int serv1, Pair fitx1, int serv2, Pair fitx2 ) {
		Estado e = new Estado(state);
		
		ArrayList<Pair> Servidor_1 = e.fitxers.get(serv1);
		int user1 = (int)(Integer)fitx1.getFirst();
		
		ArrayList<Pair> Servidor_2 = e.fitxers.get(serv2);
		int user2 = (int)(Integer)fitx2.getFirst();
		
		//MODIFICO serv1
		for ( int i = 0 ; i < Servidor_1.size() ; i++ ) {
			//Borro fitx1 de serv1 i resto el temps de descarrega del fitxer del servidor
			if ( Servidor_1.get(i).getFirst() == fitx1.getFirst() && Servidor_1.get(i).getSecond() == fitx1.getSecond() ) {
				//modifico el temps en el vector de servidors
				e.TxServer[serv1] -= Servi.servers.tranmissionTime(serv1, user1);
				//borro fitxer de servidor
				Servidor_1.remove(i);
				
				//afegeixo fitx2 a serv1
				Servidor_1.add(fitx2);
				e.TxServer[serv1] += Servi.servers.tranmissionTime(serv1, user2);
			}
		}
		
		
		
		//MODIFICO serv2
		for ( int i = 0 ; i < Servidor_2.size() ; i++ ) {
			//Borro fitx2 de serv2 i resto el temps de descarrega del fitxer del servidor
			if ( Servidor_2.get(i).getFirst() == fitx2.getFirst() && Servidor_2.get(i).getSecond() == fitx2.getSecond() ) {
				//modifico el temps en el vector de servidors
				e.TxServer[serv2] -= Servi.servers.tranmissionTime(serv2, user2);
				//borro fitxer de servidor
				Servidor_2.remove(i);
				
				//afegeixo fitx1 a serv2
				Servidor_2.add(fitx1);
				e.TxServer[serv2] += Servi.servers.tranmissionTime(serv2, user1);
			}
		}
		
		
		return e;
	}
	
	public static boolean checkSwap( Estado state, int serv1, Pair fitx1, int serv2, Pair fitx2 ) {
		
		boolean trobat = false;
        boolean trobat2 = false;
		
        Set<Integer> servList1 = Servi.servers.fileLocations( (int)(Integer)fitx1.getSecond() );
        Set<Integer> servList2 = Servi.servers.fileLocations( (int)(Integer)fitx2.getSecond() );
		
        for(Integer i : servList1){
            if(serv2 == i) trobat = true;
        }
		
        for(Integer i : servList2){
            if(serv1 == i) trobat2 = true;
        }
		
        return (trobat && trobat2);
		
	}
	
	
	public static Estado move( Estado state, Pair fitx1, int serv1, int serv2 ){
		Estado e = new Estado(state);
		
		int tam1 = e.fitxers.get(serv1).size();
		boolean borrat = false;
		for ( int i = 0; i < tam1 && !borrat; ++i ){
			if(e.fitxers.get(serv1).get(i).getFirst() == fitx1.getFirst() && e.fitxers.get(serv1).get(i).getSecond() == fitx1.getSecond()){
				//fem el canvi de usr i fitxer al server2
				e.fitxers.get(serv1).remove(i);
				e.fitxers.get(serv2).add(fitx1);
				
				//canviem el temps en el vector de temps dels servidors     
				int usr1 = (Integer) fitx1.getFirst();
				int temps = Servi.servers.tranmissionTime(serv1, usr1);
				e.TxServer[serv1] -= temps;
				
				temps = Servi.servers.tranmissionTime(serv2, usr1);
				e.TxServer[serv2] += temps;
				
				borrat = true;
			}
		}
		
		return e;
    }
	
	public static boolean checkMove( int fitxer1, int serv2 ) {
        boolean move = false;
        Set<Integer> retServ = Servi.servers.fileLocations(fitxer1);
        for ( Integer i : retServ ){
            if( serv2 == i ) move = true;
        }
        return move;
    }
	
}
